/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package BackEnd;

import Dao.PermisoDao;
import Dao.PermisoValueObject;
import Dao.PermisoXTipoUsuarioDao;
import Dao.PermisoXTipoUsuarioValueObject;
import Dao.PkId;
import Dao.TipoUsuarioDao;
import Dao.TipoUsuarioValueObject;
import BackEnd.Exceptions.CreateRegisterException;
import BackEnd.Exceptions.NotExistRegisterException;
import BackEnd.Exceptions.UpdateRegisterException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author emmanuel
 */
public class TipoUsuario {
    private long id;
    private String nombre;
    private ArrayList<Permiso> permisos;

    public TipoUsuario(){
        this.id = 0;
    }

    public TipoUsuario(String nombre, ArrayList<Permiso> permisos) {
        this.id = 0;
        this.nombre = nombre;
        this.permisos = permisos;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void agregarPermiso (Permiso p)
    {
        Iterator i = permisos.listIterator();
        Permiso aux = null;
        while (i.hasNext())
        {
            aux = (Permiso)i.next();
            if(aux.compareTo(p)==0)
            {
                i.remove();
            }
        }
        permisos.add(p);
    }

    public void quitarPermiso(Permiso p)
    {
        Iterator i = permisos.listIterator();
        Permiso aux = null;
        while (i.hasNext())
        {
            aux = (Permiso)i.next();
            if(aux.compareTo(p)==0)
            {
                i.remove();
            }
        }
    }

    public boolean abrir(long id) {
        TipoUsuarioDao tudao = new TipoUsuarioDao();
        PkId tuPk = new PkId((int)id);
        TipoUsuarioValueObject tuvo;
        try {
            tuvo = (TipoUsuarioValueObject) tudao.traer(tuPk);
            this.id = tuvo.getId();
            this.nombre = tuvo.getNombre();
            PermisoDao pdao = new PermisoDao();
            PermisoValueObject pvo[] = (PermisoValueObject[]) pdao.mostrarConsulta("select * from Permiso where id in (select id from PermisoXTipoUsuario where idTipoUsuario="+this.id+")");
            Permiso p = new Permiso();
            for(int i = 0 ; i <= pvo.length; i++ ){
                p.setId(pvo[i].getId());
                p.setNombre(pvo[i].getNombre());
                this.permisos.add(p);
            }
            return true;
        } catch (NotExistRegisterException ex) {
            Logger.getLogger(TipoUsuario.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    ArrayList<Permiso> getPermisos() {
        return permisos;
    }

    public void grabar(){
        TipoUsuarioDao tudao = new TipoUsuarioDao();
        TipoUsuarioValueObject tuvo[];
        try {
            tuvo = (TipoUsuarioValueObject[]) tudao.mostrarConsulta("select * from TipoUsuario where id="+this.id);
            if(tuvo.length == 1)
            {
                tuvo[0].setId((int)this.id);
                tuvo[0].setNombre(this.nombre);
                tudao.update(tuvo[0]);
                PermisoXTipoUsuarioDao pxtdao = new PermisoXTipoUsuarioDao();
                PermisoXTipoUsuarioValueObject pxtvo = null;
                for(int i = 0; i<= this.permisos.size(); i++)
                {
                    pxtvo = (PermisoXTipoUsuarioValueObject)tudao.mostrarConsulta("select * from TipoUsuario where id="+this.id)[0];
                    if(pxtvo != null){
                        pxtvo.setIdPermiso((int)permisos.get(i).getId());
                        pxtvo.setIdTipoUsuario((int)this.id);
                        pxtdao.update(pxtvo);
                    }
                    else
                    {
                        pxtvo = new PermisoXTipoUsuarioValueObject();
                        pxtvo.setIdPermiso((int)permisos.get(i).getId());
                        pxtvo.setIdTipoUsuario((int)this.id);
                        pxtdao.create(pxtvo);
                    }
                }


            }
            else
            {
                tuvo[0].setId((int)this.id);
                tuvo[0].setNombre(this.nombre);
                tudao.create(tuvo[0]);
                PermisoXTipoUsuarioDao pxtdao = new PermisoXTipoUsuarioDao();
                PermisoXTipoUsuarioValueObject pxtvo = new PermisoXTipoUsuarioValueObject();
                for(int i = 0; i<= this.permisos.size(); i++)
                {
                    pxtvo.setIdPermiso((int)permisos.get(i).getId());
                    pxtvo.setIdTipoUsuario((int)this.id);
                    pxtdao.create(pxtvo);
                }
            }
        } catch (NotExistRegisterException ex) {
            Logger.getLogger(TipoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch(UpdateRegisterException ex){
            Logger.getLogger(TipoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (CreateRegisterException ex){
            Logger.getLogger(TipoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
